package com.sugon.quartz.listener;

import org.quartz.JobExecutionContext;
import org.quartz.Trigger;
import org.quartz.TriggerListener;

import lombok.extern.slf4j.Slf4j;

/**
 * @desc:
 * @author: luoy
 * @date: 2021-12-10 14:21
 */
@Slf4j
public class MyTriggerListener implements TriggerListener {

    @Override
    public String getName() {
        String simpleName = this.getClass().getSimpleName();
        return simpleName;
    }

    /**
     * 当与监听器相关联的Trigger被触发，Job上的execute()方法将被执行时，Scheduler就调用该方法【job执行前】
     */
    @Override
    public void triggerFired(Trigger trigger, JobExecutionContext jobExecutionContext) {
        String name = trigger.getKey().getName();
        log.info(name + " | Job上的execute()方法将被执行时，Scheduler就调用该方法");
    }

    /**
     * 在Trigger触发后，Job将要被执行由Scheduler调用这个方法。Trigger Listener给了一个选择去否决Job的执行。假如这个方法返回true，这个Job将不会为此次Trigger而得到触发【job执行前】
     */
    @Override
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext jobExecutionContext) {
        boolean temp = false;
        String name = trigger.getKey().getName();
        log.info(name + " | Job将要被执行由Scheduler调用这个方法。Trigger Listener给了一个选择去否决Job的执行为" + (temp ? "为此次Trigger触发" : "不为此次Trigger触发"));
        return temp;
    }

    /**
     * scheduler调用这个方法是在Trigger错过触发时，你应该关注此方法中持续时间长的逻辑；在出现许多错过触发的Trigger时，长逻辑会导致骨牌效应，你应当保持这个方法尽量的少使用
     */
    @Override
    public void triggerMisfired(Trigger trigger) {
        String name = trigger.getKey().getName();
        log.info(name + " ｜ scheduler调用这个方法是在Trigger错过触发时调用该方法");
    }

    /**
     * Trigger被触发并完成了Job的执行，scheduler调用这个方法
     */
    @Override
    public void triggerComplete(Trigger trigger, JobExecutionContext jobExecutionContext, Trigger.CompletedExecutionInstruction completedExecutionInstruction) {
        String name = trigger.getKey().getName();
        log.info(name + " | Trigger被触发并完成了Job的执行，scheduler调用这个方法");
    }
}
